package com.calvin.study.multithread.thread;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

import com.calvin.study.utils.ThreadUtil;

public class Thread01 {

	public static void main(String[] args) {
		// main主线程，主线程不会因为子线程的执行 ，阻塞main线程的其他方法运行。
		// 主线程与子线程 交替执行

		Cat cat = new Cat();
		// cat.run();//run方法就是一个普通的方法，没有真正的而启动一个线程，就会把run方法执行完毕，才向下执行
		cat.start();

		// 子线程
//		new Thread(() -> {
//			while (true) {
//				try {
//					TimeUnit.SECONDS.sleep(1);
//				} catch (Exception e) {
//					// TODO: handle exception
//				}
//				System.out.println("我是小狗，汪汪汪");
//			}
//		}, "").start();
	}

}

class Dog implements Runnable {

	@Override
	public void run() {
		while (true) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (Exception e) {
				// TODO: handle exception
			}
			System.out.println("我是小狗，汪汪汪" + Thread.currentThread().getName());
		}

	}

}

class Cat extends Thread {

	int count = 0;

	public void add() {
		count++;
	}

	@Override
	public void run() {
		while (true) {
			try {
				TimeUnit.SECONDS.sleep(1);
			} catch (Exception e) {
				// TODO: handle exception
			}
			System.out.println("[" + Thread.currentThread().getName() + "]线程：" + "小猫咪，喵喵喵" + (++count));
		}
	}
}

class SalesDemo {
	public static final int MAX_AMOUNT = 5; // 商品数量

	static class StoreGoods extends Thread {
		StoreGoods(String name) {
			super(name);
		}

		private int goodsAmount = MAX_AMOUNT;

		@Override
		public void run() {
			for (int i = 0; i <= MAX_AMOUNT; i++) {
				if (this.goodsAmount > 0) {
					System.out.println(ThreadUtil.getCurThreadName() + " 卖出一件， 还剩： " + (--goodsAmount));
					ThreadUtil.sleepMilliSeconds(10);
				}
			}
			System.out.println(ThreadUtil.getCurThreadName() + " 运行结束.");
		}
	}

	// 商场商品类型（target销售线程的目标类） ， 一个商品最多销售4次， 可以多人销售
	static class MallGoods implements Runnable {
		// 多人销售可能导致数据出错， 使用原子数据类型保障数据安全
		private AtomicInteger goodsAmount = new AtomicInteger(MAX_AMOUNT);

		public void run() {
			for (int i = 0; i <= MAX_AMOUNT; i++) {
				if (this.goodsAmount.get() > 0) {
					System.out
							.println(ThreadUtil.getCurThreadName() + " 卖出一件， 还剩： " + (goodsAmount.decrementAndGet()));
					ThreadUtil.sleepMilliSeconds(10);
				}
			}
			System.out.println(ThreadUtil.getCurThreadName() + " 运行结束.");
		}
	}

	public static void main(String[] args) {
		Thread s1 = new StoreGoods("店员1");
		s1.start();
		Thread s2 = new StoreGoods("店员2");
		s2.start();
		

	}

}
